#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include"Mutex.hpp"
#include"Pthread.hpp"
#include"Cond.hpp"

using namespace MutexModule;
using namespace PthreadModule;
using namespace CondModule;

Mutex mutex;
Cond cond;

void  rountie1()
{
    while(true)
    {
        mutex.Lock();
        cond.Wait(mutex.Ptr());//加入等待
        std::cout<<"线程一被唤醒"<<std::endl;
        mutex.Unlock();
    }
}
void  rountie2()
{
    while(true)
    {
        mutex.Lock();
        cond.Wait(mutex.Ptr());//加入等待
        std::cout<<"线程二被唤醒"<<std::endl;
        mutex.Unlock();
    }
}

int main()
{
    Pthread p1(rountie1),p2(rountie2);

    p1.Start();
    p2.Start();

    int cnt=5;
    while(cnt--)
    {
        sleep(1);
        cond.Signal();
        //cond.Broadcast();
    }


    p1.Join();
    p2.Join();

    return 0;
}


// V4自制线程库
// void  rountie1()
// {
//     while(true)
//     {
//         LockGuard lockguard(mutex);
//         if(vote>0)
//         {
//             usleep(100);
//             vote--;
//             std::cout<<"线程一还剩下票数为："<<vote<<std::endl;
//         }
//         else
//         {
//             break;
//         }

//     }
// }
// void  rountie2()
// {
//     while(true)
//     {
//         LockGuard lockguard(mutex);
//         if(vote>0)
//         {
//             usleep(100);
//             vote--;
//             std::cout<<"线程二还剩下票数为："<<vote<<std::endl;
//         }
//         else
//         {
//             break;
//         }

//     }
// }
// void  rountie3()
// {
//     while(true)
//     {
//         LockGuard lockguard(mutex);
//         if(vote>0)
//         {
//             usleep(100);
//             vote--;
//             std::cout<<"线程三还剩下票数为："<<vote<<std::endl;
//         }
//         else
//         {
//             break;
//         }
//     }
// }
// int main()
// {
//     Pthread P1(rountie1),P2(rountie2),P3(rountie3);

//     P1.Start();
//     P2.Start();
//     P3.Start();

//     P1.Join();
//     P2.Join();
//     P3.Join();    
    


//     return 0;
// }



// V 3 自己封装的锁
// using namespace MutexModule;
// Mutex mutex;
// int vote=100;
// void * rountie(void*arg)
// {
//     std::string name=(char*)arg;

//     //临界资源保护 RAII风格
//     {
//         LockGuard lockguard(mutex);
//         while(vote>0)
//         {       
//             usleep(100);
//             vote--;
//             std::cout<<name<<"枪到一票，还剩下票数为："<<vote<<std::endl;
//         }
//     }


//     return arg;
// }



// int main()
// {
//     //三个线程抢票
//     pthread_t t1,t2,t3;
//     pthread_create(&t1,nullptr,rountie,(void *)"thread-1");
//     pthread_create(&t2,nullptr,rountie,(void *)"thread-2");
//     pthread_create(&t3,nullptr,rountie,(void *)"thread-3");

    

//     char *p1,*p2,*p3;
//     //加入等待
//     pthread_join(t1,(void **)&p1);
//     std::cout<<p1<<std::endl;
//     pthread_join(t2,(void **)&p2);
//     std::cout<<p2<<std::endl;
//     pthread_join(t3,(void **)&p3);
//     std::cout<<p3<<std::endl;

//     return 0;
// }


// V 2 系统自带锁  BUG资源全被一个线程独占
// pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
// int vote=100;
// void * rountie(void*arg)
// {
//     std::string name=(char*)arg;

//     //临界资源保护
//     pthread_mutex_lock(&mutex);
//     while(vote>0)
//     {       
//         usleep(100);
//         vote--;
//         std::cout<<name<<"枪到一票，还剩下票数为："<<vote<<std::endl;
//     }
//     pthread_mutex_unlock(&mutex);

//     return arg;
// }




// int main()
// {
//     //三个线程抢票
//     pthread_t t1,t2,t3;
//     pthread_create(&t1,nullptr,rountie,(void *)"thread-1");
//     pthread_create(&t2,nullptr,rountie,(void *)"thread-2");
//     pthread_create(&t3,nullptr,rountie,(void *)"thread-3");

    

//     char *p1,*p2,*p3;
//     //加入等待
//     pthread_join(t1,(void **)&p1);
//     std::cout<<p1<<std::endl;
//     pthread_join(t2,(void **)&p2);
//     std::cout<<p2<<std::endl;
//     pthread_join(t3,(void **)&p3);
//     std::cout<<p3<<std::endl;

//     return 0;
// }

// V 1 多人抢票多放票 无保护
// int vote=100;

// void * rountie(void*arg)
// {
//     std::string name=(char*)arg;

//     while(vote>0)
//     {
//         usleep(100);
//         vote--;
//         std::cout<<name<<"枪到一票，还剩下票数为："<<vote<<std::endl;
//     }

//     return nullptr;
// }


// int main()
// {
//     //三个线程抢票
//     pthread_t t1,t2,t3;
//     pthread_create(&t1,nullptr,rountie,(void *)"thread-1");
//     pthread_create(&t2,nullptr,rountie,(void *)"thread-1");
//     pthread_create(&t3,nullptr,rountie,(void *)"thread-1");




//     //加入等待
//     pthread_join(t1,nullptr);
//     pthread_join(t2,nullptr);
//     pthread_join(t3,nullptr);

//     return 0;
// }